//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Project: Money System
// Purpose: Allows deployment of economies in **any** game type that does not already have an economy
// Version: 0.1a
// Author: Max Bainrot (aka Mr Puffy) 
// Installation: Whack the sucker in your addons folder
//////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Data Structure
//////////////////////////////////////////////////////////////////////////////////////////////////////////

// Money System Folder Structure
// base_dir => data/money
// wallet => data/money/wallet

//Wallet file
// filename: <steamid>.txt
// contents: number (current wallet value)

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function List
//////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////////////
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Start of the real shit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
//////////////////////////////////////////////////////////////////////////////////////////////////////////

// INIT Metatable (as it makes life easy)
local meta = FindMetaTable("Player")

  ////////////////////////////////////////////////////////////////////////////////////////////////
 // Core/UTIL
////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////
// Function: GetPlyFile(ply)
// Purpose: Gets the player's steamid and converts it to a filesystem friendly format
////////////////////////////////////////////////////////////////////////////////////////////////

function GetPlyFile(ply)
local playersteamid = ply:SteamID()
local plyfile = "money/wallet/" .. playersteamid .. ".txt"
plyfile = string.Replace(plyfile,":","")
return plyfile
end


////////////////////////////////////////////////////////////////////////////////////////////////
// Function: Init()
// Purpose: Sets the server up for first use :)
////////////////////////////////////////////////////////////////////////////////////////////////
function Init()
Msg( "----- Setting up MoneyMod ------\n" ) 
//CREATE DATA HIARCHY IF NOT ALREADY DONE

// data/money
if (not file.IsDir("money")) then
  file.CreateDir("money")
end 

// data/money/wallet
if (not file.IsDir("money/wallet")) then
  file.CreateDir("money/wallet")
end 
end

    ////////////////////////////////////////////////////////////////////////////////////////////////
   // 
  // Meta shit
 //
//////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////
// function: MoneyMod_InitSpawn()
// Purpose: Initilises MoneyMod Data for the player's session
////////////////////////////////////////////////////////////////////////////////////////////////

function meta:MoneyMod_InitSpawn()

if (CLIENT) then return end

local plyfile = GetPlyFile(self)

if(file.Exists(plyfile)) then
// We exist, load money and setup networked var 
self:SetNetworkedInt("money",tonumber(file.Read(plyfile)))
else
// We don't exist, setup starting money
file.Write(plyfile,1000)
self:SetNetworkedInt("money",1000) // Saved 1 File i/o call :)
end

end

////////////////////////////////////////////////////////////////////////////////////////////////
// function: MoneyMod_GiveMoney(amount)
// Purpose: Give player money (e.g. salary)
////////////////////////////////////////////////////////////////////////////////////////////////

function meta:MoneyMod_GiveMoney(amount)
if (CLIENT) then return end // serverside only, sry peeps

local plyfile = GetPlyFile(self)

local cfunds = tonumber(file.Read(plyfile))

local newfunds = cfunds + amount

file.Write(plyfile,newfunds)
self:SetNetworkedInt("money",newfunds)
end

////////////////////////////////////////////////////////////////////////////////////////////////
// function: MoneyMod_TakeMoney(amount)
// Purpose: Takes a players money :) (i.e. tax)
////////////////////////////////////////////////////////////////////////////////////////////////

function meta:MoneyMod_TakeMoney(amount)
if (CLIENT) then return end // serverside only, sry peeps

local plyfile = GetPlyFile(self)

local cfunds = tonumber(file.Read(plyfile))

local newfunds = cfunds - amount

file.Write(plyfile,newfunds)
self:SetNetworkedInt("money",newfunds)
end


////////////////////////////////////////////////////////////////////////////////////////////////
// function: MoneyMod_GetMoney()
// Purpose: Returns the player's current funds
////////////////////////////////////////////////////////////////////////////////////////////////

function meta:MoneyMod_GetMoney(amount)
// SHARED FUNCTION :)
local plyfile = GetPlyFile(self)
local cfunds = tonumber(file.Read(plyfile))

return cfunds
end

// function UserIDtoPlayer(userid)
// Purpose: Converts a player id (obtained via the command status) and returns the player

function UserIDtoPlayer(userid)
	local tempid
	for k, v in pairs(player.GetAll()) do
		if(ValidEntity( v )) then
			tempid = v:UserID()
			if(tempid==userid) then
				return v
			end
		end
	end 
	return nil
end


////////////////////////////////////////////////////////////////////////////////////////////////
// function MoneyMod_PayThem(targetid, amount)
// Purpose: Funds transfer from A to B
// targetid = "player object based upon his entity index"
// amount = "DUH!"
////////////////////////////////////////////////////////////////////////////////////////////////

function meta:MoneyMod_PayThem(targetid, amount)
if (CLIENT) then return end // serverside only, sry peeps

local target = UserIDtoPlayer(targetid)

if (target == nil) then return end

local sendfile = GetPlyFile(self)
local rcptfile = GetPlyFile(target)

local sfunds = tonumber(file.Read(sendfile))
local rfunds = tonumber(file.Read(rcptfile))

if ((sfunds - amount) < 0) then
self:SendHint("Insuffient Funds!",1)
else
// funds transfer!!
target:MoneyMod_GiveMoney(amount)
self:MoneyMod_TakeMoney(amount)
// Send da pops!
target:SendHint(self:GetName() .. " gave you " .. amount,1)
self:SendHint("You just gave " .. amount .. " to " .. target:GetName(),1)
end
end

//Player:UserID( )


    ////////////////////////////////////////////////////////////////////////////////////////////////
   // 
  // Game hooks, init, etc
 //
//////////////////////////////////////////////////////////////////////////////////////////////////

/// INIT
Init()


